from cmath import inf
import numpy as np
n=1000000;
x1=4*np.random.rand(n,1)#关于这个范围其实是需要事先人为确定的
x2=9*np.random.rand(n,1)
fmax=+inf
for i in range(1,n):
    x = [x1[i-1],x2[i-1]];
    if (3*x[0]+x[1]>9) & (x[0]+2*x[1]<16):#这里的条件是用于判断对应的数组是否符合约束条件
        result = 2*x[0]*x[0]+x[1]*x[1]-x[0]*x[1]-8*x[0]-3*x[1];#对所有符合要求的数组均进行一次数据更新和比较
        if result < fmax:
            fmax = result;
            X = x;#X是结果矩阵，用于储存上一次最大值对应的答案
print('初始范围模拟求得的最大值为：',fmax)
print('对应此处的x1,x2,x3取值为：',X)
#显然这种方法的初始范围较为分散，因此接下来我们通常需要更新一下范围再搜索一次
#基本方法都是一样的，只不过改一改x1,x2,x3的范围就够了


print('下面进行细化搜索')

#重新搜索
n=1000000;
x1=2.7+0.01*np.random.rand(n,1)#关于这个范围其实是需要事先人为确定的
x2=2.85+0.01*+np.random.rand(n,1)
fmax=+inf
for i in range(1,n):
    x = [x1[i-1],x2[i-1]];
    if (3*x[0]+x[1]>9) & (x[0]+2*x[1]<16):#这里的条件是用于判断对应的数组是否符合约束条件
        result = 2*x[0]*x[0]+x[1]*x[1]-x[0]*x[1]-8*x[0]-3*x[1];#对所有符合要求的数组均进行一次数据更新和比较
        if result < fmax:
            fmax = result;
            X_0 = x;
print('缩小范围后模拟求得的最大值为：',fmax)
print('对应此处的x1,x2取值为：',X_0)


